﻿#include "RedisClient.h"  // 引入封装好的 Redis 工具类
#include <iostream>       // 用于标准输出 std::cout
#include <thread>         // 用于创建线程和睡眠控制
int main() {
    // 获取 RedisClient 单例实例
    // 单例模式保证全局只有一个 RedisClient 对象，避免重复连接和资源浪费
    auto& redis = RedisClient::getInstance();
    // 设置键值 "foo" -> "bar"，并设置过期时间为 5 秒
    // KV 操作，支持 TTL（Time To Live），5 秒后键会自动删除
    redis.set("foo", "bar", 5);
    // 获取键 "foo" 的值
    // get() 返回 std::optional<std::string>，可能存在也可能不存在
    auto val = redis.get("foo");
    // 判断键是否存在，如果存在则输出其值
    if (val)
        std::cout << "foo=" << *val << std::endl; // *val 解引用获取实际字符串
    // 订阅 Redis 渠道 "test_channel"
    // 第二个参数是回调函数，收到消息时会被调用
    // 订阅线程独立运行，不阻塞主线程
    redis.subscribe("test_channel", [](const std::string& msg) {
        std::cout << "Received: " << msg << std::endl; // 输出接收到的消息
    });
    // 主线程睡眠 1 秒，确保订阅线程已经启动并完成连接
    // 避免立即发送消息时订阅还未就绪，消息可能丢失
    std::this_thread::sleep_for(std::chrono::seconds(1));
    // 向 "test_channel" 发布消息 "Hello Redis Pub/Sub!"
    // 发布/订阅模式（Pub/Sub），消息发送后订阅该频道的客户端会收到
    redis.publish("test_channel", "Hello Redis Pub/Sub!");
    // 主线程睡眠 10 分钟，保持程序不退出
    // 订阅线程运行在独立线程，如果主线程结束，整个程序退出，订阅线程也会被终止
    std::this_thread::sleep_for(std::chrono::minutes(10)); // 保持订阅线程活跃
    return 0; // 程序正常结束
}
